﻿<pre>
 
知识点一：请问以下代码输出什么，请写出演算步骤？时间5分钟内
var a = 0,b=0;
b =  a++ + (a++ + 2), b, a = b++ ;
document.writeln(b);
document.writeln(a);
 
 
知识点二：关于逻辑运算符总结
1、逻辑与运算：document.writeln(a&&b); 
	当a的值与真等价的时候，系统会尝试运算并返回b的值，无论b是真是假。
	当a的值为假的时候系统直接返回a的值，根本不会去尝试运算b.

2、逻辑或：document.writeln(a||b); 
	当a的值与真等价的时候，系统直接返回a的值，不会尝试运算b.
	当a的值与假等价的时候，系统会尝试运算并返回b(不管b是真是假)

3、逻辑非：document.writeln(!a); 
	当a与真等价时候返回false；当a与false等价时候返回true.

特别注意：逻辑与和逻辑或运算的返回值不是true和false.而是和true或false等价的原值。
		  逻辑非的运算结果返回的是true或false.
 
 
知识点三：源码，反码，补码和取反运算符
规定：正数的源码 = 反码 = 补码(也就是都相同)
规定：负数的
	  反码 = 源码符号位不变数值位取反。
	  补码 = 反码+1  =  源码符号位不变数值位取反+1

注意：
	1、取反运算符是不考虑符号位的直接对数值的补码进行全部取反，也就是0取反后都是1,1取反后都是0
	2、取反运算符进行的运算和反码是不同概念。
 
知识点四：按位逻辑运算符总结
1、按位与运算：document.write(a&b);
	用a的补码与b的补码进行一位位运算，如果两个相同的位置都为1结果为1，否则就为0.
	例如：3 的补码是  0000 0011 
		  6 的补码是  0000 0110
		  按位与后是：0000 0010    这个也就是2的补码。

2、按位或运算：document.write(a|b);
	用a的补码与b的补码进行一位位运算，如果相同位置只要不都是0结果就是1，都是0结果是0.
	例如：3 的补码是  0000 0011 
		  6 的补码是  0000 0110
		  按位或后是：0000 0111    这个也就是7的补码。

3、按位异或运算：document.write(a^b)		  
	用a的补码与b的补码进行一位位运算，如果相同位置有差异结果就是1，无差异结果就是0.
	例如：3 的补码是  0000 0011 
		  6 的补码是  0000 0110
		    异或后是：0000 0101    这个也就是5的补码。

 
知识点五：有符号和无符号位移运算符总结
1、有符号左移  a << n
	把数值a的补码直接向左移动n位，右边补n个零,超出32位的直接溢出。
	注意：左移最简单不理会符号位。
	也就是说负数可能会因为向左移动变成正数，正数也可能会变成负数。
	例一：
		var a = -5;
		document.writeln(a<<29); //输出：1610612736
	例二： 
		var a = 7;
		document.writeln(a<<29); //输出：-536870912

2、有符号右移动 a >> n 
	把数值a的补码向右移动n位，在其左边补上符号位，右边溢出的直接删减。
	也就意味着正数位移后还是正数，负数位移后还是负数。
	例如：
		var a = -4;
		document.writeln(a>>1); //输出：-2

3、无符号右移 a >>> n
	把数值 a的补码向右移动n位，左边直接补零。也就意味着无论是正数还是负数结果都变成了正数。

</pre>